package cn.lagou.part01

/**
 * 用户位置时长统计
 * 1、对同一个用户，在同一个位置，连续的多条记录进行合并
 *  2、合并原则：开始时间取最早时间，停留时长累计求和
 */

//定义一个样例类：装载用户时长数据
case class UserInfo(userName:String,location:String,startTime:Int,duration:Int)

object UserLocationDurationCount {
  def main(args: Array[String]): Unit = {
    //定义一个列表，装载各个用户的时长数据
    val userInfoList:List[UserInfo] = List(
      UserInfo("UserA","LocationA",8, 60),
      UserInfo("UserA","LocationA",9, 60),
      UserInfo("UserB","LocationB",10, 60),
      UserInfo("UserB","LocationB",11, 80)
    )

    //因为要对同一个用户，同一个位置的数据做合并，所以把这两个字段提出来，一起作为key聚合
    val userMap = userInfoList.groupBy(t => t.userName + "," + t.location)
    println(s"userMap: $userMap")
    //对聚合后的数据，按照startTime排序
    val orderByUserMap = userMap.mapValues(t => t.sortBy(x => x.startTime))
    println(s"orderByUserMap: $orderByUserMap")

    var firstTime=0
    val totalMap = orderByUserMap.mapValues(t => {
      //将相同用户、相同位置下，最早的时间的作为firstTime
      firstTime=t.head.startTime
      //时长字段相加，并作为totalMap的value返回
      var sum = t.map(x=> x.duration).sum
      sum
    })
    println(s"totalMap: $totalMap")

    //重新组合数据，打印最终结果
    totalMap.foreach{
      case (datas, sumTime) => println(s"$datas,$firstTime,$sumTime")
    }
  }

}
